from django.db import models

# Create your models here.


# 创建省市区数据表,采用自关联方式
class Area(models.Model):
    """
    省市区
    """
    # 创建 name 字段,用户保存名称
    name = models.CharField(max_length=20,
                            verbose_name='名称')

    # 自关联字段 parent
    # 第一个参数是 self : parent 关联自己
    # on_delete=models.SET_NULL:  如果省删掉了,省内其他的信息为 NULL
    # related_name='subs': 设置之后
    # related_name指明查询一个行政区划的所有下级行政区划时，使用哪种语法查询
    # 本模型类中指明通过Area模型类对象.subs查询所有下属行政区划，而不是使用Django默认的Area模型类对象.area_set语法
    # 我们就这样调用获取市: area.area_set.all() ==> area.subs.all()
    parent = models.ForeignKey('self',
                               on_delete=models.SET_NULL,
                               related_name='subs',
                               null=True,
                               blank=True,
                               verbose_name='上级行政区划')

    class Meta:
        db_table = 'tb_areas'
        verbose_name = '行政区划'
        verbose_name_plural = '行政区划'

    def __str__(self):
        return self.name


"""
一对多的关联查询的套路
一方模型: BookInfo
多方模型: HeroInfo

一查多
    一方模型对象.多方模型类名小写_set
多查一:
    多方模型对象.外键属性名

自关联的表就是将多张一对多的表的关系和数据合并到一张表
结论:
    自关联的查询也就是一查多和多查一的套路
    省查询市(一查多):
        模型对象.模型类名小写_set
    市查询省(多查一):
        模型对象.外键属性名
        
重要提示:
    默认一查多的关联字段: 多方模型类名小写_set
    默认多查一的关联字段: 外键属性名
    
自定义一查多的关联字段:
    为什么要定义一查多的关联字段?
    因为有可能出现模型类的类名特别长的情况,那么使用默认的一查多的
    关联字段时,代码不够简洁,所以,为了让一查多的语法更加简洁,
    我们可以选择自定义一查多的关联字段
    
    实现方式:
        related_name 字段选项专门用来自定义一查多的关联字段
        related_name='自定义的字段名'
    使用方式:
        没有自定义一查多的关联字段时:
            省查市(一查多默认下):
                模型对象.模型类名小写_set
        如果自定义一查多的关联字段时:
            related_name='subs'
            省查市(一查多):
                模型对象.subs
    注意点:
        如果自定义一查多的关联字段,那么默认的一查多关联字段将失效,强制使用会报错                
        任何一对多的关联字段都可以自定义,不仅仅是自关联
"""
